#include "Global.h"

volatile int TestTimter0Finished;
volatile int TestTimter1Finished;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void __irq Interrupt_Timer0(void)
{
	ClearPending(BIT_TIMER0);
	TestTimter0Finished=1;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void __irq Interrupt_Timer1(void)
{
	ClearPending(BIT_TIMER1);
	TestTimter1Finished--;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void SetupPWM0(int _ms)
{
	rTCFG0&=(~0xff);
	rTCFG0|=127;			//prescaler =127+1
	rTCFG1&=(~0xf);
	rTCFG1|=2;			//mux = 1/8
	
	rTCNTB0=(PCLK>>10)*_ms/1000;
	rTCMPB0=rTCNTB0>>1;	// 50%
	rTCON&=(~0x1f);

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void StartPWM0(void)
{
	rTCON|=0xb;			//disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
	rTCON&=(~2);			//clear manual update bit

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void StopPWM0(void)
{
	rTCON&=(~1);			//clear manual update bit
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void RemovPWM0(void)
{
	DisableIrq(BIT_TIMER0);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TestPWM0(void)
{
	DbgOut("Timer0 Start Testing!\n");
	TestTimter0Finished=0;
	pISR_TIMER0=(uint)Interrupt_Timer0;
	EnableIrq(BIT_TIMER0);

	SetupPWM0(10000);
	StartPWM0();
	
	while(!TestTimter0Finished);

	StopPWM0();
	RemovPWM0();

	DbgOut("Timer0 Tested!\n");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void SetupPWM1(int _ms)
{
	int Val=0;
	rTCON = rTCON & (~0xf00);// clear manual update bit, stop Timer1
	rTCFG0&= 0xffffff00;// set Timer 0&1 prescaler 0
	rTCFG0|= 124;//prescaler = 15+1
	rTCFG1&= 0xffffff0f;// set Timer 0 MUX 1/4
	rTCFG1|= 0x00000030;// set Timer 0 MUX 1/4
	Val=((PCLK/(125*16*1000))*_ms)-1;
	rTCNTB1=Val;//((PCLK/(4*16*1000))*_ms)-1;

	rTCON = rTCON & (~0xf00) |(0x02<<8);// updata 		
	//rTCON = rTCON & (~0xf00) |(0x09<<8);// star

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void StartPWM1(void)
{
	rTCON&=(~0xf00);
	rTCON|=(0x02<<8);
	rTCON&=(~0xf00);
	rTCON|=(0x09<<8);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void StopPWM1(void)
{
	rTCON&=(~(0x01<<8));			//clear manual update bit
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void RemovPWM1(void)
{
	DisableIrq(BIT_TIMER1);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TestPWM1(void)
{
	DbgOut("Timer1 Start Testing!\n");
	
	TestTimter1Finished=50;
	pISR_TIMER1=(uint)Interrupt_Timer1;
	EnableIrq(BIT_TIMER1);

	//100 ms per counter
	//let us less than  1000
	SetupPWM1(100);
	StartPWM1();
	
	while(TestTimter1Finished);

	StopPWM1();
	RemovPWM1();

	DbgOut("Timer1 Tested!\n");
}
